#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define N 1010
int u[N], a[N], b[N], n;
vector <int> m[N];
bool dfs(int i)
{
	int j;
	u[i]=1;
	for(j=0; j<m[i].size(); j++)
		if(b[m[i][j]]==-1 || (!u[b[m[i][j]]] && dfs(b[m[i][j]]))) { a[i]=m[i][j]; b[m[i][j]]=i; return 1; }
	return 0;
}
void clr()
{
	int i;
	for(i=0; i<n; u[i]=0, i++);
}
int match()
{
	int i, j, f;
	for(i=0; i<n; a[i]=-1, b[i]=-1, i++);
	for(j=1, f=0; j; f+=j)
		for(clr(), j=0, i=0; i<n; j+=a[i]==-1 && !u[i] && dfs(i), i++);
	return f;
}
int main()
{
	int i, j, k, i1, j1, i2, j2;
	for(scanf("%d%d", &n, &k); k--; scanf("%d%d", &i, &j), i--, j--, m[i].push_back(j));
	for(i=0; i<n; sort(m[i].begin(), m[i].end()), i++);
	printf("%d\n", match());
	u[n]=1;
	for(i=0; i<n; i++)
	{
		for(j=0; j<m[i].size(); j++)
		{
			clr();
			i1=i; j1=a[i];
			j2=m[i][j]; i2=b[j2];
			if(i2!=-1 && u[i2]) continue;
			a[i1]=j2;
			b[j2]=n;
			if(j1==j2) break;
			if(i2!=-1) a[i2]=-1;
			if(j1!=-1) b[j1]=-1;
			if(i2==-1 || j1==-1) break;
			for(k=0; k<n; k++)
				if(!u[k] && a[k]==-1 && dfs(k)) break;
			if(k<n) break;
			else
			{
				a[i1]=j1;
				b[j2]=i2;
				if(i2!=-1) a[i2]=j2;
				if(j1!=-1) b[j1]=i1;
			}
		}
		if(j<m[i].size()) printf("%d %d\n", i1+1, j2+1);
	}
	return 0;
}